home *** CD-ROM | disk | FTP | other *** search
/ Apple WWDC 1996 / WWDC96_1996 (CD).toast / Technology Materials / MacOS 8 Resources / Developer Tools / Mac OS 8 Interfaces & Libraries / Interfaces / CIncludes / Synchronization.h < prev    next >
C/C++ Source or Header  |  1996-05-01  |  6KB  |  208 lines

  1. /*
  2.      File:        Synchronization.h
  3.  
  4.      Contains:    Synchronization Interfaces
  5.  
  6.      Version:    Technology:    System 8
  7.                  Release:    Universal Interfaces 3.0d3 on Copland DR1
  8.  
  9.      Copyright:    © 1984-1996 by Apple Computer, Inc.  All rights reserved.
  10.  
  11.      Bugs?:        If you find a problem with this file, send the file and version
  12.                  information (from above) and the problem description to:
  13.  
  14.                      Internet:    apple.bugs@applelink.apple.com
  15.                      AppleLink:    APPLE.BUGS
  16.  
  17. */
  18. #ifndef __SYNCHRONIZATION__
  19. #define __SYNCHRONIZATION__
  20.  
  21. #ifndef __TYPES__
  22. #include <Types.h>
  23. #endif
  24. #ifndef __KERNEL__
  25. #include <Kernel.h>
  26. #endif
  27.  
  28. #ifdef __cplusplus
  29. extern "C" {
  30. #endif
  31.  
  32. #if PRAGMA_IMPORT_SUPPORTED
  33. #pragma import on
  34. #endif
  35.  
  36. #if PRAGMA_ALIGN_SUPPORTED
  37. #pragma options align=power
  38. /* the following contents can only be used by compilers that support PowerPC struct alignment */
  39.  
  40. #if FOR_SYSTEM8_PREEMPTIVE
  41. /* Note:  Lock, ReadWriteLock, and CountingSemaphore data structures must be LONG WORD ALIGNED in memory!*/
  42. struct Lock {
  43.     UInt32                             theInfo[2];
  44. };
  45. typedef struct Lock Lock;
  46.  
  47. typedef Lock *LockPtr;
  48. struct ReadWriteLock {
  49.     UInt32                             theInfo[5];
  50. };
  51. typedef struct ReadWriteLock ReadWriteLock;
  52.  
  53. typedef ReadWriteLock *ReadWriteLockPtr;
  54. struct CountingSemaphore {
  55.     UInt32                             theInfo[6];
  56. };
  57. typedef struct CountingSemaphore CountingSemaphore;
  58.  
  59. typedef CountingSemaphore *CountingSemaphorePtr;
  60. typedef OptionBits LockOptions;
  61.  
  62. enum {
  63.     kLockDisablesSwis            = 0x00000001,                    /* disable software interrupts while locked*/
  64.     kLockAdjustsPriorities        = 0x00000002,                    /* lock prevents priority inversion*/
  65.     kLockDisablesCompletionRoutines = 0x00000004                /* disable software interrupts and system 7 completion routines while locked*/
  66. };
  67.  
  68. typedef void *InterruptState;
  69. /*
  70.  Simple lock routines
  71.  Locks may be created with the kLockDisablesSwis and/or kLockDisablesCompletionRoutines options,
  72.  but no others.
  73. */
  74. extern OSStatus CreateLock(Lock *theLock, LockOptions theOptions);
  75.  
  76. extern OSStatus DeleteLock(Lock *theLock);
  77.  
  78. extern OSStatus BeginLockedSection(Lock *theLock);
  79.  
  80. extern OSStatus TryBeginLockedSection(Lock *theLock);
  81.  
  82. extern OSStatus EndLockedSection(Lock *theLock);
  83.  
  84. extern Boolean IsLockedSectionHeld(Lock *theLock);
  85.  
  86. /*
  87.  Reader/writer lock routines
  88.  ReadWriteLocks may be created with the kLockDisablesSwis, kLockDisablesCompletionRoutines,
  89.  and/or kLockAdjustsPriorities options.
  90. */
  91. extern OSStatus CreateReadWriteLock(ReadWriteLock *theReadWriteLock, LockOptions theOptions);
  92.  
  93. extern OSStatus DeleteReadWriteLock(ReadWriteLock *theReadWriteLock);
  94.  
  95. extern OSStatus BeginReadLockedSection(ReadWriteLock *theReadWriteLock);
  96.  
  97. extern OSStatus TryBeginReadLockedSection(ReadWriteLock *theReadWriteLock);
  98.  
  99. extern OSStatus EndReadLockedSection(ReadWriteLock *theReadWriteLock);
  100.  
  101. extern OSStatus BeginWriteLockedSection(ReadWriteLock *theReadWriteLock);
  102.  
  103. extern OSStatus TryBeginWriteLockedSection(ReadWriteLock *theReadWriteLock);
  104.  
  105. extern OSStatus EndWriteLockedSection(ReadWriteLock *theReadWriteLock);
  106.  
  107. extern OSStatus ChangeWriteLockToReadLock(ReadWriteLock *theReadWriteLock);
  108.  
  109. extern Boolean IsReadLockedSectionHeld(ReadWriteLock *theReadWriteLock);
  110.  
  111. extern Boolean IsWriteLockedSectionHeld(ReadWriteLock *theReadWriteLock);
  112.  
  113. extern ItemCount GetReadWriteLockReaderCount(ReadWriteLock *theReadWriteLock);
  114.  
  115. extern TaskID GetReadWriteLockWriterID(ReadWriteLock *theReadWriteLock);
  116.  
  117. /*
  118.  Counting semaphore routines
  119.  CountingSemaphores currently have no options.
  120. */
  121. extern OSStatus CreateCountingSemaphore(CountingSemaphore *theCountingSemaphore, LockOptions theOptions, SInt32 initialCount, SInt32 maximumCount);
  122.  
  123. extern OSStatus DeleteCountingSemaphore(CountingSemaphore *theCountingSemaphore);
  124.  
  125. extern OSStatus WaitForCountingSemaphore(CountingSemaphore *theCountingSemaphore);
  126.  
  127. extern OSStatus SignalCountingSemaphore(CountingSemaphore *theCountingSemaphore);
  128.  
  129. extern SInt32 GetCountingSemaphoreCount(CountingSemaphore *theCountingSemaphore);
  130.  
  131. extern SInt32 GetCountingSemaphoreMaxCount(CountingSemaphore *theCountingSemaphore);
  132.  
  133. extern ItemCount GetCountingSemaphoreWaiterCount(CountingSemaphore *theCountingSemaphore);
  134.  
  135. /*
  136.  Interrupt enabling and disabling.  ** MAY ONLY BE CALLED FROM PRIVILEGED CODE!!! **
  137.  Use very sparingly.
  138. */
  139. extern InterruptState DisableInterrupts(void );
  140.  
  141. extern void RestoreInterrupts(InterruptState theState);
  142.  
  143. /*
  144.  Atomic operations on 8-, 16-, and 32-bit entities.
  145.  ** OPERATIONS THAT CROSS WORD (32-BIT) BOUNDARIES WILL FAIL!!! **
  146. */
  147. extern Boolean CompareAndSwapAligned(UInt32 oldValue, UInt32 newValue, UInt32 *theValue);
  148.  
  149. /* Note: TestAndSet uses PPC bit ordering, zero is the high bit, and theBit ranges from 0 - FFFFFFFF.*/
  150. extern Boolean TestAndSet(UInt32 theBit, UInt8 *startAddress);
  151.  
  152. extern SInt8 IncrementAtomic8(SInt8 *value);
  153.  
  154. extern SInt8 DecrementAtomic8(SInt8 *value);
  155.  
  156. extern SInt8 AddAtomic8(SInt32 amount, SInt8 *value);
  157.  
  158. extern UInt8 BitAndAtomic8(UInt32 mask, UInt8 *value);
  159.  
  160. extern UInt8 BitOrAtomic8(UInt32 mask, UInt8 *value);
  161.  
  162. extern UInt8 BitXorAtomic8(UInt32 mask, UInt8 *value);
  163.  
  164. extern SInt16 IncrementAtomic16Aligned(SInt16 *theValue);
  165.  
  166. extern SInt16 DecrementAtomic16Aligned(SInt16 *theValue);
  167.  
  168. extern SInt16 AddAtomic16Aligned(SInt32 theAmount, SInt16 *theValue);
  169.  
  170. extern UInt16 BitAndAtomic16Aligned(UInt32 theMask, UInt16 *theValue);
  171.  
  172. extern UInt16 BitOrAtomic16Aligned(UInt32 theMask, UInt16 *theValue);
  173.  
  174. extern UInt16 BitXorAtomic16Aligned(UInt32 theMask, UInt16 *theValue);
  175.  
  176. extern SInt32 IncrementAtomicAligned(SInt32 *theValue);
  177.  
  178. extern SInt32 DecrementAtomicAligned(SInt32 *theValue);
  179.  
  180. extern SInt32 AddAtomicAligned(SInt32 theAmount, SInt32 *theValue);
  181.  
  182. extern UInt32 BitAndAtomicAligned(UInt32 theMask, UInt32 *theValue);
  183.  
  184. extern UInt32 BitOrAtomicAligned(UInt32 theMask, UInt32 *theValue);
  185.  
  186. extern UInt32 BitXorAtomicAligned(UInt32 theMask, UInt32 *theValue);
  187.  
  188. /* Atomic primitives for singly linked list manipulation.*/
  189. extern void PushListElementAtomic(void *theListHead, void *theListElement, UInt32 theLinkOffset);
  190.  
  191. extern void *PopListElementAtomic(void *theListHead, UInt32 theLinkOffset);
  192.  
  193. #endif
  194.  
  195. #pragma options align=reset
  196. #endif /* PRAGMA_ALIGN_SUPPORTED */
  197.  
  198. #if PRAGMA_IMPORT_SUPPORTED
  199. #pragma import off
  200. #endif
  201.  
  202. #ifdef __cplusplus
  203. }
  204. #endif
  205.  
  206. #endif /* __SYNCHRONIZATION__ */
  207.  
  208.